package org.sef4j.jdbc.optional;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class InstrumenterHelper {
private static final Logger LOG = LoggerFactory.getLogger(InstrumenterHelper.class);
@SuppressWarnings("restriction")
protected static final sun.misc.Unsafe UNSAFE = AccessController.doPrivileged(new PrivilegedAction<sun.misc.Unsafe>() {
public sun.misc.Unsafe run() {
try {
java.lang.reflect.Field singleoneInstanceField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
boolean prev = singleoneInstanceField.isAccessible();
singleoneInstanceField.setAccessible(true);
sun.misc.Unsafe ret = (sun.misc.Unsafe)singleoneInstanceField.get(null);
singleoneInstanceField.setAccessible(prev);
return ret;
} catch (Throwable e) {
LOG.error("Could not instanciate sun.miscUnsafe. should use java.nio DirectByteBuffer ?",e);
return null;
}
}
});
protected static void unsafeSetField(Object obj, String fieldName, Object value) {
Class<?> clss = obj.getClass();
unsafeSetField(obj, clss, fieldName, value);
}
protected static void unsafeSetField(Object obj, Class<?> clss, String fieldName, Object value) {
Field field = getFieldOfRethrow(clss, fieldName);
// int fieldOffset = UNSAFE.fieldOffset(field);
// UNSAFE.putObject(obj, fieldOffset, value);
boolean prevIsAccessible = field.isAccessible();
try {
field.setAccessible(true);
field.set(obj, value);
} catch (IllegalArgumentException ex) {
throw new RuntimeException("Failed to set " + clss + "." + fieldName, ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Failed to set " + clss + "." + fieldName, ex);
} finally {
field.setAccessible(prevIsAccessible);
}
}
protected static <T> T unsafeGetField(Object obj, String fieldName) {
Class<?> clss = obj.getClass();
return unsafeGetField(obj, clss, fieldName);
}
@SuppressWarnings("unchecked")
protected static <T> T unsafeGetField(Object obj, Class<?> clss, String fieldName) {
Field field = getFieldOfRethrow(clss, fieldName);
// int fieldOffset = UNSAFE.fieldOffset(field);
// UNSAFE.putObject(obj, fieldOffset, value);
boolean prevIsAccessible = field.isAccessible();
try {
field.setAccessible(true);
return (T) field.get(obj);
} catch (IllegalArgumentException ex) {
throw new RuntimeException("Failed to get " + clss + "." + fieldName, ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Failed to get " + clss + "." + fieldName, ex);
} finally {
field.setAccessible(prevIsAccessible);
}
}
protected static Field getFieldOfRethrow(Class<?> clss, String fieldName) {
Field field;
try {
field = clss.getDeclaredField(fieldName);
} catch (NoSuchFieldException ex) {
throw new RuntimeException("Failed to set " + clss + "." + fieldName, ex);
} catch (SecurityException ex) {
throw new RuntimeException("Failed to set " + clss + "." + fieldName, ex);
}
return field;
}
}